import kagglehub
# Importamos el dataset de imagenes de deteccion de tumores.
path = kagglehub.dataset_download("navoneel/brain-mri-images-for-brain-tumor-detection")
print("Path to dataset files:", path)
Path to dataset files: /kaggle/input/brain-mri-images-for-brain-tumor-detection
import numpy as np #Numpy para el manejo de arrays dataset y demas.
from tqdm import tqdm #Para implementar barra de progreso
import cv2 #Extracion de caracteristicas carga de imagenes, normalizacion.....
import os # Libreria para creacion y manejo de ficheros.
import shutil
import itertools
import imutils
import matplotlib.pyplot as plt # Para graficas y demas.
from sklearn.preprocessing import LabelBinarizer # Importacion para el manejo de redes cnn
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, confusion_matrix
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
from plotly import tools
from tensorflow.keras.preprocessing.image import ImageDataGenerator #Libreria para la generacion de imagenes para el preprocesado
from keras.applications.vgg16 import VGG16, preprocess_input
from keras import layers
from keras.models import Model, Sequential #Importacion de modelos.
from tensorflow.keras.optimizers import Adam, RMSprop
from keras.callbacks import EarlyStopping
init_notebook_mode(connected=True)
RANDOM_SEED = 123
print("ok")
ok
pip install imutils
Requirement already satisfied: imutils in /usr/local/lib/python3.10/dist-packages (0.5.4) Note: you may need to restart the kernel to use updated packages.
!apt-get install --fix-missing tree #Preparamos las carpetas para el entrenamiento de los datos.
#clear_output()
# Creamos las carpetas que contendrán las imágenes de entrenamiento
!mkdir TRAIN TEST VAL TRAIN/YES TRAIN/NO TEST/YES TEST/NO VAL/YES VAL/NO
!tree -d
Reading package lists... Done Building dependency tree... Done Reading state information... Done The following NEW packages will be installed: tree 0 upgraded, 1 newly installed, 0 to remove and 129 not upgraded. Need to get 47.9 kB of archives. After this operation, 116 kB of additional disk space will be used. Ign:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1 Ign:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1 Ign:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1 Err:1 http://archive.ubuntu.com/ubuntu jammy/universe amd64 tree amd64 2.0.2-1 Temporary failure resolving 'archive.ubuntu.com' E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/universe/t/tree/tree_2.0.2-1_amd64.deb Temporary failure resolving 'archive.ubuntu.com' E: Internal Error, ordering was unable to handle the media swap mkdir: cannot create directory ‘TRAIN’: File exists mkdir: cannot create directory ‘TEST’: File exists mkdir: cannot create directory ‘VAL’: File exists mkdir: cannot create directory ‘TRAIN/YES’: File exists mkdir: cannot create directory ‘TRAIN/NO’: File exists mkdir: cannot create directory ‘TEST/YES’: File exists mkdir: cannot create directory ‘TEST/NO’: File exists mkdir: cannot create directory ‘VAL/YES’: File exists mkdir: cannot create directory ‘VAL/NO’: File exists /bin/bash: line 1: tree: command not found
IMG_PATH = '../input/brain-mri-images-for-brain-tumor-detection/' #Ruta para la obtencion de las imagenes.
# Divide las imágenes del dataset original en train/val/test
for CLASS in os.listdir(IMG_PATH):
if os.path.isfile(CLASS) == False and (CLASS == "yes" or CLASS == "no"):
print(CLASS)
IMG_NUM = len(os.listdir(IMG_PATH + CLASS))
print(IMG_NUM)
for n, FILE_NAME in enumerate(os.listdir(IMG_PATH + CLASS)):
img = IMG_PATH + CLASS + '/' + FILE_NAME
print(img)
if n < 0.2 * IMG_NUM: #Condicional para que solo copie en la carpeta de testing el 0.2 de las imagenes.
shutil.copy(img, 'TEST/' + CLASS.upper() + '/' + FILE_NAME)
print("TO TEST")
elif n < 0.8 * IMG_NUM: #Condicional para que se copie el 0.8.
shutil.copy(img, 'TRAIN/' + CLASS.upper() + '/' + FILE_NAME)
print("TO TRAIN")
else:
shutil.copy(img, 'VAL/' + CLASS.upper() + '/' + FILE_NAME)
print("TO VAL")
no 98 ../input/brain-mri-images-for-brain-tumor-detection/no/34 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/N20.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/N1.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/49 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/N15.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/No18.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/31 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/no 6.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/3 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/no 5.jpeg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/no 1.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/26 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/N26.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/N5.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/6 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/No21.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/17 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/No22.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/29 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/46 no.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/no/32 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/42 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 90.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 94.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No19.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/47 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/N22.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No12.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/15 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/20 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No13.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/11 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/N11.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No17.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 98.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/18 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/N19.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/25 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/24 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 91.jpeg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/45 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/22 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No16.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/44no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/4 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/36 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/8 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/48 no.jpeg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No20.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 2.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 10.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/7 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/10 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/N17.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/14 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 8.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/38 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/40 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 9.png TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/N3.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 89.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/19 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/12 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/N2.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No11.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 92.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No14.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/39 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 7.jpeg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/27 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/5 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 95.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 3.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/No15.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 923.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/28 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/no 100.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/23 no.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/no/13 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/37 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/21 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/30 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/no 4.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/9 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/no 99.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/N21.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/50 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/43 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/no 96.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/41 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/N16.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/no 97.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/1 no.jpeg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/2 no.jpeg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/35 no.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/N6.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/no/33 no.jpg TO VAL yes 155 ../input/brain-mri-images-for-brain-tumor-detection/yes/Y115.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y192.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y162.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y9.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y108.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y155.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y106.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y258.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y103.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y185.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y180.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y120.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y54.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y165.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y112.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y99.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y3.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y184.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y82.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y169.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y146.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y147.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y116.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y27.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y73.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y181.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y81.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y161.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y17.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y69.jpg TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y158.JPG TO TEST ../input/brain-mri-images-for-brain-tumor-detection/yes/Y32.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y186.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y259.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y42.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y250.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y58.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y60.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y252.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y182.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y154.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y79.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y31.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y98.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y91.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y95.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y22.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y35.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y33.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y247.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y19.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y160.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y13.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y29.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y55.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y4.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y50.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y114.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y26.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y257.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y97.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y14.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y25.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y170.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y51.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y34.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y39.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y15.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y104.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y187.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y167.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y40.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y38.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y111.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y37.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y24.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y157.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y6.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y28.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y164.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y30.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y90.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y92.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y86.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y46.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y248.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y1.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y2.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y62.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y67.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y109.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y117.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y194.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y71.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y7.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y59.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y246.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y66.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y148.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y243.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y56.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y18.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y23.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y96.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y195.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y65.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y16.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y193.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y45.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y53.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y245.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y159.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y12.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y100.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y102.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y75.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y256.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y10.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y253.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y105.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y166.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y61.jpg TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y47.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y255.JPG TO TRAIN ../input/brain-mri-images-for-brain-tumor-detection/yes/Y70.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y168.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y163.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y188.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y242.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y21.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y36.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y254.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y183.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y74.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y251.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y52.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y153.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y156.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y11.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y77.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y249.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y41.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y76.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y78.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y20.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y85.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y49.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y244.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y8.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y107.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y113.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y101.jpg TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y89.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y44.JPG TO VAL ../input/brain-mri-images-for-brain-tumor-detection/yes/Y92.png TO VAL
Podriamos balancear el dataset antes del proceso de carga de las imagenes en los directorios para mejorar los resultados. En este caso vemos que el dataset es muy pequeño asique el balanceo quiza no sea lo mas correcto aqui.
def load_data(dir_path, img_size=(100, 100)):
# Creamos dos arrays vacios para para almacenar etiquetas . La funcion recibe dos parametros , directorio de las carpetas y y el tamaño de las imagenes.
X = []
y = []
i = 0
labels = dict() #Mapeo de las etiquetas numericas a los nombres de las clases.
for path in tqdm(sorted(os.listdir(dir_path))):
if not path.startswith('.'):
labels[i] = path
for file in os.listdir(dir_path + '/' + path):
if not file.startswith('.'):
img = cv2.imread(dir_path + '/' + path + '/' + file)
X.append(img)
y.append(i)
i += 1
X = np.array(X, dtype=object) #Conversion de las listas en array de numpy.
y = np.array(y)
print(f'{len(X)} imágenes cargadas desde: {dir_path}.')
return X, y, labels
TRAIN_DIR = 'TRAIN/'
TEST_DIR = 'TEST/'
VAL_DIR = 'VAL/'
IMG_SIZE = (224, 224)
# Cargamos cada uno de los conjuntos de imágenes: entrenamiento, prueba y validación
X_train, y_train, labels = load_data(TRAIN_DIR, IMG_SIZE)
X_test, y_test, _ = load_data(TEST_DIR, IMG_SIZE)
X_val, y_val, _ = load_data(VAL_DIR, IMG_SIZE)
100%|██████████| 2/2 [00:00<00:00, 8.83it/s]
152 imágenes cargadas desde: TRAIN/.
100%|██████████| 2/2 [00:00<00:00, 29.48it/s]
51 imágenes cargadas desde: TEST/.
100%|██████████| 2/2 [00:00<00:00, 23.14it/s]
50 imágenes cargadas desde: VAL/.
#Imprimimos el contenido de labels para saber que podamos separar la funcion que nos pide en el ejercicio en en dos partes. Las imagenes que su clase es No y yes.
print(labels)
{0: 'NO', 1: 'YES'}
import numpy as np
import matplotlib.pyplot as plt
import cv2
def plot_samples(X, y, labels, class_label, num_samples): #Funcion que recibe 4 parametros, imagenes etiquetas, mapeo, clase y numero de imagenes que quieres obtener.
print(('Tumor: NO' if class_label == 0 else 'Tumor: YES').center(50))
# Obtenemos los indices para buscar las imagenes de la clase que queramos mostrar.
class_indices = np.where(y == class_label)[0]
# Mostrar las imágenes
plt.figure(figsize=(12, 8))
for i in range(num_samples):
idx = class_indices[i]
plt.subplot(5, 6, i + 1)
plt.imshow(cv2.cvtColor(X[idx], cv2.COLOR_BGR2RGB)) # Convierte de BGR a RGB
plt.title(labels[y[idx]]) # Muestra la etiqueta de la imagen
plt.axis("off")
plt.tight_layout()
plt.show()
Vista de las imagenes que pertenecen a los patientes sin tumor cerebral.
plot_samples(X_train,y_train,labels,0,30)
Tumor: NO
Vista de las imagenes que pertenecen a los patientes con tumor cerebral.
plot_samples(X_train,y_train,labels,1,30)
Tumor: YES
def crop_imgs(set_name, add_pixels_value=0): #Funcion para recortar los extremos de las imagenes.
set_new = []
for img in set_name:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.GaussianBlur(gray, (5, 5), 0)
# Umbralizar la imagen, luego realizar una serie de erosiones y dilataciones para eliminar pequeños ruidos
thresh = cv2.threshold(gray, 25, 255, cv2.THRESH_BINARY)[1]
thresh = cv2.erode(thresh, None, iterations=2)
thresh = cv2.dilate(thresh, None, iterations=2)
# Encuentra los contornos en la imagen umbralizada y toma el más grande
cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = max(cnts, key=cv2.contourArea)
# Encuentra los píxeles extremos
extLeft = tuple(cnt[cnt[:, :, 0].argmin()][0])
extRight = tuple(cnt[cnt[:, :, 0].argmax()][0])
extTop = tuple(cnt[cnt[:, :, 1].argmin()][0])
extBot = tuple(cnt[cnt[:, :, 1].argmax()][0])
ADD_PIXELS = add_pixels_value
new_img = img[extTop[1]-ADD_PIXELS:extBot[1]+ADD_PIXELS, extLeft[0]-ADD_PIXELS:extRight[0]+ADD_PIXELS].copy()
set_new.append(new_img)
return np.array(set_new, dtype=object)
X_train_crop = crop_imgs(set_name=X_train) #Guardamos en las nuevas variables las imagenes ya recortadas.
X_val_crop = crop_imgs(set_name=X_val)
X_test_crop = crop_imgs(set_name=X_test)
Vista de las imagenes que pertenecen a los patientes sin tumor cerebral recortadas para mejorar el procesado.
plot_samples(X_train_crop,y_train,labels,0,30)
Tumor: NO
Vista de las imagenes que pertenecen a los patientes con tumor cerebral.
plot_samples(X_train_crop,y_train,labels,1,30)
Tumor: YES
def save_new_images(x_set, y_set, folder_name):
i = 0
for (img, imclass) in zip(x_set, y_set):
if imclass == 0:
cv2.imwrite(folder_name + 'NO/' + str(i) + '.jpg', img)
else:
cv2.imwrite(folder_name + 'YES/' + str(i) + '.jpg', img)
i += 1
# Creamos las carpetas donde guardaremos las imágenes
!mkdir TRAIN_CROP TEST_CROP VAL_CROP TRAIN_CROP/YES
!mkdir TRAIN_CROP/NO TEST_CROP/YES TEST_CROP/NO VAL_CROP/YES
!mkdir VAL_CROP/NO
# Creamos la nueva estructura con las imagenes ya recortadas.
save_new_images(X_train_crop, y_train, folder_name='TRAIN_CROP/')
save_new_images(X_val_crop, y_val, folder_name='VAL_CROP/')
save_new_images(X_test_crop, y_test, folder_name='TEST_CROP/')
mkdir: cannot create directory ‘TRAIN_CROP’: File exists mkdir: cannot create directory ‘TEST_CROP’: File exists mkdir: cannot create directory ‘VAL_CROP’: File exists mkdir: cannot create directory ‘TRAIN_CROP/YES’: File exists mkdir: cannot create directory ‘TRAIN_CROP/NO’: File exists mkdir: cannot create directory ‘TEST_CROP/YES’: File exists mkdir: cannot create directory ‘TEST_CROP/NO’: File exists mkdir: cannot create directory ‘VAL_CROP/YES’: File exists mkdir: cannot create directory ‘VAL_CROP/NO’: File exists
def preprocess_imgs(set_name, img_size): #Esta funcion toma las imagenes ya recortadas anteriormente y las redimensiona al valor aportado en el parametro img_size
set_new = []
for img in set_name:
img = cv2.resize(
img,
dsize=img_size,
interpolation=cv2.INTER_CUBIC
)
set_new.append(preprocess_input(img))
return np.array(set_new)
X_train_prep = preprocess_imgs(set_name=X_train_crop, img_size=(224, 224)) #Tamaño que añadimos es 224*224
X_test_prep = preprocess_imgs(set_name=X_test_crop, img_size=(224, 224))
X_val_prep = preprocess_imgs(set_name=X_val_crop, img_size=(224, 224))
Vista de las imagenes que pertenecen a los patientes sin tumor y habiendoles aplicado el preprocesado.
plot_samples(X_train_prep ,y_train,labels,0,30)
Tumor: NO
Vista de las imagenes que pertenecen a los patientes sin tumor y habiendoles aplicado el preprocesado.
plot_samples(X_train_prep ,y_train,labels,1,30)
Tumor: YES
TRAIN_DIR = 'TRAIN_CROP/' #Con imageData generator generamos imagenes de entrenamiento con aumento de datos en tiempo real.
VAL_DIR = 'VAL_CROP/'
train_datagen = ImageDataGenerator( #Parametros para el desplazamiento hgasta el 10% del ancho de la imagen.
rotation_range=15,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.1,
brightness_range=[0.5, 1.5],
horizontal_flip=True,
vertical_flip=True,
preprocessing_function=preprocess_input
)
test_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input
)
train_generator = train_datagen.flow_from_directory( #Sirve para generar imagenes de entrenamiento a partir del directorio que le pasen como valor
TRAIN_DIR,
color_mode='rgb',
target_size=IMG_SIZE,
batch_size=32,
class_mode='binary',
seed=RANDOM_SEED
)
validation_generator = test_datagen.flow_from_directory(
VAL_DIR,
color_mode='rgb',
target_size=IMG_SIZE,
batch_size=16,
class_mode='binary',
seed=RANDOM_SEED
)
Found 152 images belonging to 2 classes. Found 50 images belonging to 2 classes.
# Cargamos un modelo preenetrenado y le añadimos nosotros las capas que queramos
base_model = VGG16(
weights="/kaggle/input/pesosvgg16/vgg16_weights_tf_dim_ordering_tf_kernels_notop.h5",
include_top=False,
input_shape=IMG_SIZE + (3,)
)
NUM_CLASSES = 1
model = Sequential() #Modelo sequential
model.add(base_model) #Le agregamos el modelo preentrenado
model.add(layers.Flatten()) #Capa desalida
model.add(layers.Dropout(0.5)) #Reduccion el sobreajuste.
model.add(layers.Dense(NUM_CLASSES, activation='sigmoid')) #Capa densa con activation sigmoid
model.layers[0].trainable = False
model.compile( #Compilacion del modelo con un Rmsprop de optimizador.
loss='binary_crossentropy',
optimizer=RMSprop(learning_rate=1e-4),
metrics=['accuracy']
)
model.summary() #Mostamos resultados
Model: "sequential_1"
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ ┃ Layer (type) ┃ Output Shape ┃ Param # ┃ ┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ │ vgg16 (Functional) │ (None, 7, 7, 512) │ 14,714,688 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ flatten_1 (Flatten) │ (None, 25088) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dropout_1 (Dropout) │ (None, 25088) │ 0 │ ├──────────────────────────────────────┼─────────────────────────────┼─────────────────┤ │ dense_1 (Dense) │ (None, 1) │ 25,089 │ └──────────────────────────────────────┴─────────────────────────────┴─────────────────┘
Total params: 14,739,777 (56.23 MB)
Trainable params: 25,089 (98.00 KB)
Non-trainable params: 14,714,688 (56.13 MB)
EPOCHS = 30 #Iteraciones completas sobre el conjunto de datos.
batch_size = 32 #Aqui pondremos las muestras que e procesan simultaneamente durante el entrenamiento
val_batch_size = 16
es = EarlyStopping(
monitor='accuracy',
mode='max',
patience=6
)
history = model.fit( #Entrenamiento del modelo y valoracion del modelo
train_generator,
steps_per_epoch=len(X_train) // batch_size,
epochs=EPOCHS,
validation_data=validation_generator,
validation_steps=len(X_test) // val_batch_size,
callbacks=[es]
)
Epoch 1/30
/usr/local/lib/python3.10/dist-packages/keras/src/trainers/data_adapters/py_dataset_adapter.py:122: UserWarning: Your `PyDataset` class should call `super().__init__(**kwargs)` in its constructor. `**kwargs` can include `workers`, `use_multiprocessing`, `max_queue_size`. Do not pass these arguments to `fit()`, as they will be ignored.
4/4 ━━━━━━━━━━━━━━━━━━━━ 51s 14s/step - accuracy: 0.5227 - loss: 5.6808 - val_accuracy: 0.5833 - val_loss: 2.0513 Epoch 2/30 1/4 ━━━━━━━━━━━━━━━━━━━━ 26s 9s/step - accuracy: 0.5625 - loss: 4.4821
/usr/lib/python3.10/contextlib.py:153: UserWarning: Your input ran out of data; interrupting training. Make sure that your dataset or generator can generate at least `steps_per_epoch * epochs` batches. You may need to use the `.repeat()` function when building your dataset.
4/4 ━━━━━━━━━━━━━━━━━━━━ 28s 6s/step - accuracy: 0.5625 - loss: 4.4821 - val_accuracy: 1.0000 - val_loss: 6.0071e-04 Epoch 3/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 49s 13s/step - accuracy: 0.5688 - loss: 3.8434 - val_accuracy: 0.6667 - val_loss: 2.1530 Epoch 4/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 28s 6s/step - accuracy: 0.5312 - loss: 7.2679 - val_accuracy: 1.0000 - val_loss: 0.0597 Epoch 5/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 50s 13s/step - accuracy: 0.6859 - loss: 3.4870 - val_accuracy: 0.6042 - val_loss: 1.5783 Epoch 6/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 9s 180ms/step - accuracy: 0.4375 - loss: 5.0709 - val_accuracy: 0.0000e+00 - val_loss: 10.8640 Epoch 7/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 50s 14s/step - accuracy: 0.6679 - loss: 3.0938 - val_accuracy: 0.6875 - val_loss: 2.0057 Epoch 8/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 9s 181ms/step - accuracy: 0.4688 - loss: 4.7341 - val_accuracy: 1.0000 - val_loss: 0.3191 Epoch 9/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 49s 13s/step - accuracy: 0.7442 - loss: 2.7088 - val_accuracy: 0.7083 - val_loss: 1.7283 Epoch 10/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 10s 181ms/step - accuracy: 0.6250 - loss: 3.2440 - val_accuracy: 0.5000 - val_loss: 8.4603 Epoch 11/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 49s 13s/step - accuracy: 0.7241 - loss: 3.2934 - val_accuracy: 0.7083 - val_loss: 1.8957 Epoch 12/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 9s 177ms/step - accuracy: 0.5000 - loss: 4.5809 - val_accuracy: 1.0000 - val_loss: 0.0022 Epoch 13/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 74s 13s/step - accuracy: 0.6680 - loss: 4.2179 - val_accuracy: 0.7292 - val_loss: 1.5880 Epoch 14/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 27s 6s/step - accuracy: 0.7188 - loss: 2.2785 - val_accuracy: 0.5000 - val_loss: 1.7420 Epoch 15/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 51s 13s/step - accuracy: 0.7104 - loss: 2.1104 - val_accuracy: 0.7500 - val_loss: 2.0497 Epoch 16/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 7s 180ms/step - accuracy: 0.4583 - loss: 5.4589 - val_accuracy: 1.0000 - val_loss: 0.0025 Epoch 17/30 4/4 ━━━━━━━━━━━━━━━━━━━━ 50s 13s/step - accuracy: 0.6988 - loss: 2.9430 - val_accuracy: 0.7083 - val_loss: 1.8751
# plot model performance
acc = history.history['accuracy']
val_acc = history.history['val_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs_range = range(1, len(history.epoch) + 1)
plt.figure(figsize=(15, 5))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Train Set')
plt.plot(epochs_range, val_acc, label='Val Set')
plt.legend(loc='best')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.title('Model Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Train Set')
plt.plot(epochs_range, val_loss, label='Val Set')
plt.legend(loc='best')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.title('Model Loss')
plt.tight_layout()
plt.show()
print(history.history.keys())
dict_keys(['accuracy', 'loss', 'val_accuracy', 'val_loss'])
def plot_confusion_matrix(cm, classes, #Definicion de la funcion para ver la matrix de confusion y valorar resultados.
normalize=False,
title='Confusion matrix',
cmap=plt.cm.Blues):
"""
"""
plt.figure(figsize=(6, 6))
plt.imshow(cm, interpolation='nearest', cmap=cmap)
plt.title(title)
plt.colorbar()
tick_marks = np.arange(len(classes))
plt.xticks(tick_marks, classes, rotation=90)
plt.yticks(tick_marks, classes)
if normalize:
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
thresh = cm.max() / 2.
for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):
plt.text(j, i, cm[i, j],
horizontalalignment="center",
color="white" if cm[i, j] > thresh else "black")
plt.tight_layout()
plt.ylabel('True label')
plt.xlabel('Predicted label')
plt.show()
# validate on val set #Hacemos las prediciones del modelo con la matriz de confusion.
predictions = model.predict(X_val_prep)
predictions = [1 if x>=0.5 else 0 for x in predictions]
accuracy = accuracy_score(y_val, predictions)
print('Val Accuracy = %.2f%%' % accuracy)
confusion_mtx = confusion_matrix(y_val, predictions)
cm = plot_confusion_matrix(confusion_mtx, classes = list(labels.items()), normalize=False)
2/2 ━━━━━━━━━━━━━━━━━━━━ 14s 5s/step Val Accuracy = 0.72%
Como podemos observar obtenemos un de accuracy de 0,72 lo que nos obligaria a intentar mejorar el modelo . Las posibles soluciones pasarian por aumentar el dataset, revisar los datos, cambiar los optimizadores, añadir capas y probar a compensar el desbalance de las clases.
Finalmente en esta actividad aprendemos a procesar imagenes,a redimensionarlas , recortar los bordes para poder preprocesarlas de la manera mas adecuada. Cargar las imagenes en distintos directorios. Cargar un modelo preentrenado , añadirselo al modelo que queramos utilizar y añadir capas para el entrenamiento del modelo.